package atom.core0.log;

import org.apache.log4j.helpers.FormattingInfo;
import org.apache.log4j.helpers.PatternConverter;
import org.apache.log4j.helpers.PatternParser;
import org.apache.log4j.spi.LoggingEvent;

public class ExPatternParser extends PatternParser
{

	public ExPatternParser(String pattern)
	{
		super(pattern);
	}

	/**
	 * 重写finalizeConverter，对特定的占位符进行处理，T表示线程ID占位符
	 */
	@Override
	protected void finalizeConverter(char c)
	{
		if (c == 'T')
		{
			this.addConverter(new ExPatternConverter(this.formattingInfo));
		}
		else
		{
			super.finalizeConverter(c);
		}
	}

	private static class ExPatternConverter extends PatternConverter
	{

		public ExPatternConverter(FormattingInfo fi)
		{
			super(fi);
		}

		/**
		 * 当需要显示线程ID的时候，返回当前调用线程的ID
		 */
		@Override
		protected String convert(LoggingEvent event)
		{
			return String.valueOf(Thread.currentThread().getId());
		}

	}
}

/*
 * 到此已经扩展完成，将以上内容编译后（可以打成jar包）和log4j.jar一同使用（使用同一个类装载器装载），然后配置log4j.properties类，修改
 * 
 * log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 * 
 * 为 log4j.appender.stdout.layout=ex.log4j.ExPatternLayout
 * 
 * 在输出格式中增加%T（log4j定义%t表示线程名称，%T没有定义，所以这里使用%T表示线程ID），
 */

